home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mint110s / asmtab.c < prev    next >
C/C++ Source or Header  |  1993-08-16  |  22KB  |  775 lines

  1. #ifndef lint
  2. char yysccsid[] = "@(#)yaccpar    1.3 (Berkeley) 01/21/90";
  3. #endif
  4. #define WORD 257
  5. #define WHITESP 258
  6. #define EOLN 259
  7. #define STRING 260
  8. #define DEFINECMD 261
  9. #define INCLUDECMD 262
  10. #define IFDEFCMD 263
  11. #define IFNDEFCMD 264
  12. #define ELSECMD 265
  13. #define ENDIFCMD 266
  14. #define YYERRCODE 256
  15. #line 3 "asm.y"
  16. #define YYSTYPE char *
  17.  
  18. #include "asmtrans.h"
  19. #line 19 "y_tab.c"
  20. short yylhs[] = {                                        -1,
  21.     0,    0,    1,    1,    1,    1,    1,    1,    1,    1,
  22.     1,    1,    1,    1,    3,    3,    3,    3,    6,    6,
  23.     5,    2,    4,    4,    4,    4,    4,    4,    4,    4,
  24.     4,    4,    4,    4,    4,    7,    7,    7,    8,    8,
  25.     9,    9,    9,    9,
  26. };
  27. short yylen[] = {                                         2,
  28.     0,    2,    1,    2,    2,    3,    4,    4,    6,    6,
  29.     4,    4,    2,    2,    2,    4,    3,    5,    1,    3,
  30.     1,    2,    1,    2,    3,    4,    4,    4,    4,    6,
  31.     6,   11,   11,    5,    7,    1,    3,    2,    1,    2,
  32.     1,    1,    1,    1,
  33. };
  34. short yydefred[] = {                                      1,
  35.     0,    0,    0,    3,    0,    0,    0,    0,    0,    0,
  36.     2,    0,    0,    0,   22,   21,    0,    0,    0,    0,
  37.     0,   13,   14,    0,    4,    0,    5,    0,    0,    0,
  38.     0,    0,    0,    0,    6,    0,   39,    0,    0,    0,
  39.     0,    0,   16,    0,    0,    0,    8,    7,   11,   12,
  40.    18,    0,   24,    0,    0,    0,   38,   40,    0,    0,
  41.     0,   41,   42,   43,   44,    0,    0,    0,    0,    0,
  42.     0,   20,    0,    0,   37,    9,   10,    0,    0,   29,
  43.    26,   27,    0,   28,    0,    0,    0,   34,    0,    0,
  44.     0,    0,    0,   30,   31,    0,    0,   35,    0,    0,
  45.     0,    0,    0,    0,   33,   32,
  46. };
  47. short yydgoto[] = {                                       1,
  48.    11,   12,   13,   42,   17,   43,   44,   45,   66,
  49. };
  50. short yysindex[] = {                                      0,
  51.  -168,  -47, -235,    0, -226, -224, -217, -215, -210, -202,
  52.     0, -203, -201, -235,    0,    0, -214, -198, -221, -197,
  53.  -195,    0,    0, -193,    0, -196,    0, -192,  -33, -191,
  54.  -189, -185, -184, -180,    0,  -33,    0,  -28,  -30,  -27,
  55.  -177,   24,    0,  -24,  -12,  -35,    0,    0,    0,    0,
  56.     0,  -28,    0,  -28,   40,  -28,    0,    0,  -33,  -28,
  57.   -28,    0,    0,    0,    0,  -28, -175, -174,  -17,  -29,
  58.    41,    0,    4,   28,    0,    0,    0,  -28,    9,    0,
  59.     0,    0,  -28,    0,  -28,  -15,  -28,    0,   51,  -25,
  60.   -28,   57,   62,    0,    0,   12,  -28,    0,   63,   64,
  61.   -28,  -28,   65,   68,    0,    0,
  62. };
  63. short yyrindex[] = {                                      0,
  64.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  65.     0,    0,    0,    0,    0,    0, -149,    0,    0,    0,
  66.     0,    0,    0,    0,    0,    0,    0, -148,    0,    0,
  67.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  68.     0, -147,    0,  -40,  -21,    0,    0,    0,    0,    0,
  69.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  70.     0,    0,    0,    0,    0,    0,    0,    0,    0,  -23,
  71.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  72.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  73.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  74.     0,    0,    0,    0,    0,    0,
  75. };
  76. short yygindex[] = {                                      0,
  77.     0,    0,  101,   69,  100,   -8,  -14,    0,    0,
  78. };
  79. #define YYTABLESIZE 238
  80. short yytable[] = {                                      38,
  81.    41,   38,   41,   23,   39,   41,   39,   41,   41,   40,
  82.    15,   40,   56,   81,   52,   60,   52,   52,   36,   36,
  83.    25,   16,   36,   53,   55,   57,   78,   51,   91,   64,
  84.    62,   18,   63,   19,   65,   31,   36,   57,   32,   69,
  85.    20,   71,   21,   29,   84,   73,   74,   83,   22,   88,
  86.    72,   75,   87,   24,    3,   25,   23,   27,   30,   33,
  87.    54,   34,   35,   86,   14,   36,   46,   59,   89,   47,
  88.    90,   36,   93,   48,   49,   79,   96,   92,   50,   58,
  89.    70,   82,  100,   76,   77,   85,  103,  104,    2,    3,
  90.     4,   94,    5,    6,    7,    8,    9,   10,   61,   95,
  91.    97,   36,   98,   36,   99,  105,  101,  102,  106,   15,
  92.    17,   19,   26,   28,   68,    0,    0,    0,    0,    0,
  93.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  94.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  95.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  96.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  97.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  98.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  99.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  100.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  101.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  102.    14,    0,    0,    0,    0,    0,    0,    0,   23,    0,
  103.     0,   37,    0,   37,   67,    0,   37,   80,   37,   37,
  104.     0,    0,    0,    0,    0,   25,    0,   36,
  105. };
  106. short yycheck[] = {                                      35,
  107.    36,   35,   36,   44,   40,   36,   40,   36,   36,   45,
  108.    58,   45,   40,   43,   45,   40,   45,   45,   40,   41,
  109.    44,  257,   44,   38,   39,   40,   44,   36,   44,   42,
  110.    43,  258,   45,  258,   47,  257,   58,   52,  260,   54,
  111.   258,   56,  258,  258,   41,   60,   61,   44,  259,   41,
  112.    59,   66,   44,  257,  258,  259,  259,  259,  257,  257,
  113.    91,  257,  259,   78,  258,  258,  258,   44,   83,  259,
  114.    85,   93,   87,  259,  259,   93,   91,   93,  259,  257,
  115.    41,   41,   97,  259,  259,   58,  101,  102,  257,  258,
  116.   259,   41,  261,  262,  263,  264,  265,  266,  123,  125,
  117.    44,  123,   41,  125,   93,   41,   44,   44,   41,  259,
  118.   259,  259,   12,   14,   46,   -1,   -1,   -1,   -1,   -1,
  119.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  120.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  121.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  122.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  123.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  124.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  125.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  126.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  127.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  128.   258,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  259,   -1,
  129.    -1,  257,   -1,  257,  260,   -1,  257,  257,  257,  257,
  130.    -1,   -1,   -1,   -1,   -1,  259,   -1,  259,
  131. };
  132. #define YYFINAL 1
  133. #ifndef YYDEBUG
  134. #define YYDEBUG 0
  135. #endif
  136. #define YYMAXTOKEN 266
  137. #if YYDEBUG
  138. char *yyname[] = {
  139. "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  140. 0,"'#'","'$'",0,0,0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0,0,0,0,
  141. 0,0,"':'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'['",
  142. 0,"']'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'{'",0,"'}'",
  143. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  144. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  145. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  146. 0,0,0,0,0,0,0,0,0,0,0,"WORD","WHITESP","EOLN","STRING","DEFINECMD","INCLUDECMD",
  147. "IFDEFCMD","IFNDEFCMD","ELSECMD","ENDIFCMD",
  148. };
  149. char *yyrule[] = {
  150. "$accept : input",
  151. "input :",
  152. "input : input line",
  153. "line : EOLN",
  154. "line : label EOLN",
  155. "line : opline EOLN",
  156. "line : label opline EOLN",
  157. "line : INCLUDECMD WHITESP STRING EOLN",
  158. "line : INCLUDECMD WHITESP WORD EOLN",
  159. "line : DEFINECMD WHITESP WORD WHITESP STRING EOLN",
  160. "line : DEFINECMD WHITESP WORD WHITESP operand EOLN",
  161. "line : IFDEFCMD WHITESP WORD EOLN",
  162. "line : IFNDEFCMD WHITESP WORD EOLN",
  163. "line : ELSECMD EOLN",
  164. "line : ENDIFCMD EOLN",
  165. "opline : WHITESP opcode",
  166. "opline : WHITESP opcode WHITESP ops",
  167. "opline : WORD WHITESP opcode",
  168. "opline : WORD WHITESP opcode WHITESP ops",
  169. "ops : operand",
  170. "ops : operand ',' ops",
  171. "opcode : WORD",
  172. "label : WORD ':'",
  173. "operand : basic",
  174. "operand : '#' basic",
  175. "operand : '(' basic ')'",
  176. "operand : '(' basic ')' '+'",
  177. "operand : '-' '(' basic ')'",
  178. "operand : basic '(' basic ')'",
  179. "operand : '(' basic ')' WORD",
  180. "operand : basic '(' basic ',' basic ')'",
  181. "operand : basic '{' basic ':' basic '}'",
  182. "operand : '(' '[' basic ',' basic ']' ',' basic ',' basic ')'",
  183. "operand : '(' '[' basic ',' basic ',' basic ']' ',' basic ')'",
  184. "operand : '(' '[' basic ']' ')'",
  185. "operand : '(' '[' basic ']' ',' basic ')'",
  186. "basic : basexpr",
  187. "basic : basexpr op basic",
  188. "basic : '-' basic",
  189. "basexpr : WORD",
  190. "basexpr : '$' WORD",
  191. "op : '+'",
  192. "op : '-'",
  193. "op : '*'",
  194. "op : '/'",
  195. };
  196. #endif
  197. #ifndef YYSTYPE
  198. typedef int YYSTYPE;
  199. #endif
  200. #define yyclearin (yychar=(-1))
  201. #define yyerrok (yyerrflag=0)
  202. #ifndef YYSTACKSIZE
  203. #ifdef YYMAXDEPTH
  204. #define YYSTACKSIZE YYMAXDEPTH
  205. #else
  206. #define YYSTACKSIZE 300
  207. #endif
  208. #endif
  209. int yydebug;
  210. int yynerrs;
  211. int yyerrflag;
  212. int yychar;
  213. short *yyssp;
  214. YYSTYPE *yyvsp;
  215. YYSTYPE yyval;
  216. YYSTYPE yylval;
  217. #define yystacksize YYSTACKSIZE
  218. short yyss[YYSTACKSIZE];
  219. YYSTYPE yyvs[YYSTACKSIZE];
  220. #line 103 "asm.y"
  221. #include <setjmp.h>
  222.  
  223. jmp_buf start;
  224.  
  225. #ifdef NATIVEATARI
  226. #define STACK 32*1024L
  227. #ifdef LATTICE
  228. long _STACK = STACK;
  229. #endif
  230. #ifdef __GNUC__
  231. long _stksize = STACK;
  232. #endif
  233.  
  234. static void
  235. hit_return()
  236. {
  237.     printf("Hit return to continue\n");
  238.     fflush(stdout);
  239.     getchar();
  240. }
  241. #endif
  242.  
  243. void usage()
  244. {
  245.     fprintf(stderr, "Usage: asmtrans [-gas][-asm][-o outfile] infile\n");
  246.     exit(2);
  247. }
  248.  
  249. int errors = 0;
  250.  
  251. void
  252. do_include(file)
  253.     char *file;
  254. {
  255.     jmp_buf save;
  256.     FILE *oldin, *f;
  257.  
  258.     f = fopen(file, "rt");
  259.     if (!f) {
  260.         perror(file);
  261.         return;
  262.     }
  263.     bcopy(start, save, sizeof(jmp_buf));
  264.     oldin = infile;
  265.     infile = f;
  266.     setjmp(start);
  267.     yyparse();
  268.     fclose(f);
  269.     infile = oldin;
  270.     bcopy(save, start, sizeof(jmp_buf));
  271.     longjmp(start,1);
  272. }
  273.  
  274. /* set up initial definitions based on syntax type */
  275.  
  276. void
  277. do_initial_defs()
  278. {
  279.     if (syntax == GAS) {
  280.         do_define("mmusr", "psr");
  281.         do_define("fpiar", "fpi");
  282.         do_define("XREF", ".globl");
  283.         do_define("XDEF", ".globl");
  284.         do_define("TEXT", ".text");
  285.         do_define("DATA", ".data");
  286.     /* gas doesn't have a .bss directive */
  287.         do_define("BSS", ".data");
  288.         do_define("END", "| END");
  289.         do_define("dc.l", ".long");
  290.         do_define("dc.w", ".word");
  291.         do_define("dc.b", ".byte");
  292.     } else if (syntax == ASM) {
  293.         do_define("TEXT", "SECTION TEXT,CODE");
  294.         do_define("DATA", "SECTION DATA,DATA");
  295.         do_define("BSS", "SECTION BSS,BSS");
  296.     }
  297. }
  298.  
  299. int
  300. main (argc, argv)
  301.     int argc; char **argv;
  302. {
  303.     FILE *f;
  304. #ifdef NATIVEATARI
  305.     if (!argv[0] || !argv[0][0])    /* run from desktop? */
  306.         atexit(hit_return);
  307. #endif
  308.     argv++;
  309.     outfile = stdout;
  310.  
  311.     while (*argv) {
  312.         if (!strcmp(*argv, "-o")) {
  313.             argv++;
  314.             if (*argv == 0) {
  315.                 fprintf(stderr, "missing argument to -o\n");
  316.                 usage();
  317.             }
  318.             f = fopen(*argv, "wt");
  319.             if (!f)
  320.                 perror(*argv);
  321.             else
  322.                 outfile = f;
  323.             argv++;
  324.         } else if (!strcmp(*argv, "-gas")) {
  325.             argv++;
  326.             syntax = GAS;
  327.         } else if (!strcmp(*argv, "-asm")) {
  328.             argv++;
  329.             syntax = ASM;
  330.         } else if (!strcmp(*argv, "-purec")) {
  331.             argv++;
  332.             syntax = PUREC;
  333.         } else if (!strncmp(*argv, "-D", 2)) {
  334.             char *word, *defn;
  335.             word = *argv+2;
  336.             defn = index(word,'=');
  337.             if (defn)
  338.                 *defn++ = '\0';
  339.             else
  340.                 defn = "1";
  341.             if (*word) do_define(word,defn);
  342.             argv++;
  343.         } else if (!strcmp(*argv, "--")) {
  344.             argv++;
  345.             break;
  346.         } else {
  347.             if (**argv == '-') {
  348.                 fprintf(stderr, "unknown option: %s\n",
  349.                     *argv);
  350.                 usage();
  351.             }
  352.             break;
  353.         }
  354.     }
  355.  
  356.     do_initial_defs();
  357.  
  358.     if (*argv == 0) {
  359.         setjmp(start);
  360.         infile = stdin;
  361.         yyparse();
  362.     } else {
  363.         while(*argv) {
  364.         if (!(f = fopen(*argv, "rt")))
  365.             perror(*argv);
  366.         else {
  367.             infile = f;
  368.             setjmp(start);
  369.             yyparse();
  370.             fclose(f);
  371.         }
  372.         argv++;
  373.         }
  374.     }
  375.  
  376.     if (ifstkptr != 0) {
  377.         fputs("%ifdef without matching %endif\n", stderr);
  378.         errors++;
  379.     }
  380.     return errors;
  381. }
  382.  
  383. void
  384. yyerror (s)  /* Called by yyparse on error */
  385.      char *s;
  386. {
  387.     errors++;
  388.     printf("%s\n", s);
  389.     longjmp(start, 1);
  390. }
  391.  
  392. void dbgmsg(s) char *s;
  393. {
  394.     fprintf(stderr, "%s\n", s);
  395. }
  396. #line 396 "y_tab.c"
  397. #define YYABORT goto yyabort
  398. #define YYACCEPT goto yyaccept
  399. #define YYERROR goto yyerrlab
  400. int
  401. yyparse()
  402. {
  403.     register int yym, yyn, yystate;
  404. #if YYDEBUG
  405.     register char *yys;
  406.     extern char *getenv();
  407.  
  408.     if (yys = getenv("YYDEBUG"))
  409.     {
  410.         yyn = *yys;
  411.         if (yyn == '0')
  412.             yydebug = 0;
  413.         else if (yyn >= '1' && yyn <= '9')
  414.             yydebug = yyn - '0';
  415.     }
  416. #endif
  417.  
  418.     yynerrs = 0;
  419.     yyerrflag = 0;
  420.     yychar = (-1);
  421.  
  422.     yyssp = yyss;
  423.     yyvsp = yyvs;
  424.     *yyssp = yystate = 0;
  425.  
  426. yyloop:
  427.     if (yyn = yydefred[yystate]) goto yyreduce;
  428.     if (yychar < 0)
  429.     {
  430.         if ((yychar = yylex()) < 0) yychar = 0;
  431. #if YYDEBUG
  432.         if (yydebug)
  433.         {
  434.             yys = 0;
  435.             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  436.             if (!yys) yys = "illegal-symbol";
  437.             printf("yydebug: state %d, reading %d (%s)\n", yystate,
  438.                     yychar, yys);
  439.         }
  440. #endif
  441.     }
  442.     if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
  443.             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
  444.     {
  445. #if YYDEBUG
  446.         if (yydebug)
  447.             printf("yydebug: state %d, shifting to state %d\n",
  448.                     yystate, yytable[yyn]);
  449. #endif
  450.         if (yyssp >= yyss + yystacksize - 1)
  451.         {
  452.             goto yyoverflow;
  453.         }
  454.         *++yyssp = yystate = yytable[yyn];
  455.         *++yyvsp = yylval;
  456.         yychar = (-1);
  457.         if (yyerrflag > 0)  --yyerrflag;
  458.         goto yyloop;
  459.     }
  460.     if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
  461.             yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
  462.     {
  463.         yyn = yytable[yyn];
  464.         goto yyreduce;
  465.     }
  466.     if (yyerrflag) goto yyinrecovery;
  467. #ifdef lint
  468.     goto yynewerror;
  469. #endif
  470. yynewerror:
  471.     yyerror("syntax error");
  472. #ifdef lint
  473.     goto yyerrlab;
  474. #endif
  475. yyerrlab:
  476.     ++yynerrs;
  477. yyinrecovery:
  478.     if (yyerrflag < 3)
  479.     {
  480.         yyerrflag = 3;
  481.         for (;;)
  482.         {
  483.             if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
  484.                     yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
  485.             {
  486. #if YYDEBUG
  487.                 if (yydebug)
  488.                     printf("yydebug: state %d, error recovery shifting\
  489.  to state %d\n", *yyssp, yytable[yyn]);
  490. #endif
  491.                 if (yyssp >= yyss + yystacksize - 1)
  492.                 {
  493.                     goto yyoverflow;
  494.                 }
  495.                 *++yyssp = yystate = yytable[yyn];
  496.                 *++yyvsp = yylval;
  497.                 goto yyloop;
  498.             }
  499.             else
  500.             {
  501. #if YYDEBUG
  502.                 if (yydebug)
  503.                     printf("yydebug: error recovery discarding state %d\n",
  504.                             *yyssp);
  505. #endif
  506.                 if (yyssp <= yyss) goto yyabort;
  507.                 --yyssp;
  508.                 --yyvsp;
  509.             }
  510.         }
  511.     }
  512.     else
  513.     {
  514.         if (yychar == 0) goto yyabort;
  515. #if YYDEBUG
  516.         if (yydebug)
  517.         {
  518.             yys = 0;
  519.             if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  520.             if (!yys) yys = "illegal-symbol";
  521.             printf("yydebug: state %d, error recovery discards token %d (%s)\n",
  522.                     yystate, yychar, yys);
  523.         }
  524. #endif
  525.         yychar = (-1);
  526.         goto yyloop;
  527.     }
  528. yyreduce:
  529. #if YYDEBUG
  530.     if (yydebug)
  531.         printf("yydebug: state %d, reducing by rule %d (%s)\n",
  532.                 yystate, yyn, yyrule[yyn]);
  533. #endif
  534.     yym = yylen[yyn];
  535.     yyval = yyvsp[1-yym];
  536.     switch (yyn)
  537.     {
  538. case 3:
  539. #line 25 "asm.y"
  540. { emit(yyvsp[0]); }
  541. break;
  542. case 4:
  543. #line 28 "asm.y"
  544. { emit(yyvsp[-1]); emit(yyvsp[0]); }
  545. break;
  546. case 5:
  547. #line 29 "asm.y"
  548. { emit(yyvsp[-1]); emit(yyvsp[0]); }
  549. break;
  550. case 6:
  551. #line 30 "asm.y"
  552. { emit(yyvsp[-2]); emit(yyvsp[-1]);
  553.             emit(yyvsp[0]); }
  554. break;
  555. case 7:
  556. #line 32 "asm.y"
  557. { if (!hidecnt) do_include(yyvsp[-1]); free(yyvsp[-1]); }
  558. break;
  559. case 8:
  560. #line 33 "asm.y"
  561. { if (!hidecnt) do_include(yyvsp[-1]); free(yyvsp[-1]); }
  562. break;
  563. case 9:
  564. #line 34 "asm.y"
  565. {
  566.         if (!hidecnt) do_define(yyvsp[-3], yyvsp[-1]); free(yyvsp[-3]); free(yyvsp[-1]); }
  567. break;
  568. case 10:
  569. #line 36 "asm.y"
  570. {
  571.         if (!hidecnt) do_define(yyvsp[-3], yyvsp[-1]); free(yyvsp[-3]); free(yyvsp[-1]); }
  572. break;
  573. case 11:
  574. #line 38 "asm.y"
  575. { do_ifdef(yyvsp[-1]); free(yyvsp[-1]); }
  576. break;
  577. case 12:
  578. #line 39 "asm.y"
  579. { do_ifndef(yyvsp[-1]); free(yyvsp[-1]); }
  580. break;
  581. case 13:
  582. #line 40 "asm.y"
  583. { do_else(); }
  584. break;
  585. case 14:
  586. #line 41 "asm.y"
  587. { do_endif(); }
  588. break;
  589. case 15:
  590. #line 44 "asm.y"
  591. { yyval  = do_ops("", yyvsp[0], "", ""); free(yyvsp[0]); }
  592. break;
  593. case 16:
  594. #line 46 "asm.y"
  595. { yyval  = do_ops("", yyvsp[-2], yyvsp[-1], yyvsp[0]);
  596.              free(yyvsp[-2]); free(yyvsp[-1]); free(yyvsp[0]); }
  597. break;
  598. case 17:
  599. #line 48 "asm.y"
  600. { yyval  = do_ops(yyvsp[-2], yyvsp[0], "", ""); free(yyvsp[-2]); free(yyvsp[0]); }
  601. break;
  602. case 18:
  603. #line 50 "asm.y"
  604. { yyval  = do_ops(yyvsp[-4], yyvsp[-2], yyvsp[-1], yyvsp[0]);
  605.              free(yyvsp[-4]); free(yyvsp[-2]); free(yyvsp[-1]); free(yyvsp[0]);}
  606. break;
  607. case 19:
  608. #line 54 "asm.y"
  609. { yyval  = yyvsp[0]; }
  610. break;
  611. case 20:
  612. #line 55 "asm.y"
  613. { yyval  = concat3(yyvsp[-2], ",", yyvsp[0]);
  614.                 free(yyvsp[-2]); free(yyvsp[0]); }
  615. break;
  616. case 21:
  617. #line 59 "asm.y"
  618. { yyval  = wordlookup(yyvsp[0]); free(yyvsp[0]); }
  619. break;
  620. case 22:
  621. #line 62 "asm.y"
  622. { yyval  = concat(yyvsp[-1], ":"); free(yyvsp[-1]); }
  623. break;
  624. case 23:
  625. #line 64 "asm.y"
  626. {yyval  = yyvsp[0]; }
  627. break;
  628. case 24:
  629. #line 65 "asm.y"
  630. {yyval  = immediate(yyvsp[0]); free(yyvsp[0]); }
  631. break;
  632. case 25:
  633. #line 66 "asm.y"
  634. {yyval  = indirect(yyvsp[-1]); free(yyvsp[-1]); }
  635. break;
  636. case 26:
  637. #line 67 "asm.y"
  638. {yyval  = postinc(yyvsp[-2]); free(yyvsp[-2]); }
  639. break;
  640. case 27:
  641. #line 68 "asm.y"
  642. {yyval  = predec(yyvsp[-1]); free(yyvsp[-1]); }
  643. break;
  644. case 28:
  645. #line 69 "asm.y"
  646. {yyval  = indexed(yyvsp[-3], yyvsp[-1]); free(yyvsp[-3]); free(yyvsp[-1]); }
  647. break;
  648. case 29:
  649. #line 70 "asm.y"
  650. {yyval  = sizedop(yyvsp[-2], yyvsp[0]); free(yyvsp[-2]); free(yyvsp[0]); }
  651. break;
  652. case 30:
  653. #line 71 "asm.y"
  654. {yyval  = twoindex(yyvsp[-5], yyvsp[-3], yyvsp[-1]);
  655.                 free(yyvsp[-5]); free(yyvsp[-3]); free(yyvsp[-1]); }
  656. break;
  657. case 31:
  658. #line 73 "asm.y"
  659. {yyval  = bitfield(yyvsp[-5], yyvsp[-3], yyvsp[-1]);
  660.             free(yyvsp[-5]); free(yyvsp[-3]); free(yyvsp[-1]); }
  661. break;
  662. case 32:
  663. #line 76 "asm.y"
  664. { yyval =postindex(yyvsp[-8],yyvsp[-6],yyvsp[-3],yyvsp[-1]); 
  665.          free(yyvsp[-8]); free(yyvsp[-6]); free(yyvsp[-3]); free(yyvsp[-1]); }
  666. break;
  667. case 33:
  668. #line 79 "asm.y"
  669. { yyval =preindex(yyvsp[-8],yyvsp[-6],yyvsp[-4],yyvsp[-1]); 
  670.          free(yyvsp[-8]); free(yyvsp[-6]); free(yyvsp[-4]); free(yyvsp[-1]); }
  671. break;
  672. case 34:
  673. #line 82 "asm.y"
  674. { yyval =postindex0(yyvsp[-2]); 
  675.          free(yyvsp[-2]); }
  676. break;
  677. case 35:
  678. #line 85 "asm.y"
  679. { yyval =postindex1(yyvsp[-4],yyvsp[-1]); 
  680.          free(yyvsp[-4]); free(yyvsp[-1]); }
  681. break;
  682. case 36:
  683. #line 89 "asm.y"
  684. { yyval  = yyvsp[0]; }
  685. break;
  686. case 37:
  687. #line 90 "asm.y"
  688. { yyval  = concat3(yyvsp[-2], yyvsp[-1], yyvsp[0]); free(yyvsp[-2]); free(yyvsp[-1]); free(yyvsp[0]); }
  689. break;
  690. case 38:
  691. #line 91 "asm.y"
  692. { yyval  = concat("-", yyvsp[0]); free(yyvsp[0]); }
  693. break;
  694. case 39:
  695. #line 93 "asm.y"
  696. {yyval  = wordlookup(yyvsp[0]); free(yyvsp[0]); }
  697. break;
  698. case 40:
  699. #line 94 "asm.y"
  700. {yyval  = hexop(yyvsp[0]); free(yyvsp[0]);}
  701. break;
  702. case 41:
  703. #line 97 "asm.y"
  704. { yyval  = strdup("+"); }
  705. break;
  706. case 42:
  707. #line 98 "asm.y"
  708. { yyval  = strdup("-"); }
  709. break;
  710. case 43:
  711. #line 99 "asm.y"
  712. { yyval  = strdup("*"); }
  713. break;
  714. case 44:
  715. #line 100 "asm.y"
  716. { yyval  = strdup("/"); }
  717. break;
  718. #line 718 "y_tab.c"
  719.     }
  720.     yyssp -= yym;
  721.     yystate = *yyssp;
  722.     yyvsp -= yym;
  723.     yym = yylhs[yyn];
  724.     if (yystate == 0 && yym == 0)
  725.     {
  726. #ifdef YYDEBUG
  727.         if (yydebug)
  728.             printf("yydebug: after reduction, shifting from state 0 to\
  729.  state %d\n", YYFINAL);
  730. #endif
  731.         yystate = YYFINAL;
  732.         *++yyssp = YYFINAL;
  733.         *++yyvsp = yyval;
  734.         if (yychar < 0)
  735.         {
  736.             if ((yychar = yylex()) < 0) yychar = 0;
  737. #if YYDEBUG
  738.             if (yydebug)
  739.             {
  740.                 yys = 0;
  741.                 if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
  742.                 if (!yys) yys = "illegal-symbol";
  743.                 printf("yydebug: state %d, reading %d (%s)\n",
  744.                         YYFINAL, yychar, yys);
  745.             }
  746. #endif
  747.         }
  748.         if (yychar == 0) goto yyaccept;
  749.         goto yyloop;
  750.     }
  751.     if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
  752.             yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
  753.         yystate = yytable[yyn];
  754.     else
  755.         yystate = yydgoto[yym];
  756. #ifdef YYDEBUG
  757.     if (yydebug)
  758.         printf("yydebug: after reduction, shifting from state %d \
  759. to state %d\n", *yyssp, yystate);
  760. #endif
  761.     if (yyssp >= yyss + yystacksize - 1)
  762.     {
  763.         goto yyoverflow;
  764.     }
  765.     *++yyssp = yystate;
  766.     *++yyvsp = yyval;
  767.     goto yyloop;
  768. yyoverflow:
  769.     yyerror("yacc stack overflow");
  770. yyabort:
  771.     return (1);
  772. yyaccept:
  773.     return (0);
  774. }
  775.